package com.shujia.spark.sql

import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}

object Demo1WordCount {
  def main(args: Array[String]): Unit = {

    /**
     * spark sql的入口SparkSession
     * SparkSession也是spark新版本通过一的入口
     *
     */
    val spark: SparkSession = SparkSession
      .builder()
      .master("local")
      .appName("sql")
      .getOrCreate()

    /**
     * 1、读取数据构建DataFrame,DF相当于一张表
     *
     */

    val linesDF: DataFrame = spark
      .read
      .format("csv") //指定读取数据的格式
      .schema("line STRING") //指定字段名和字段类型
      .option("sep", "\t") //指定分隔符，csv格式默认时逗号分隔
      .load("data/words.txt")

    //打印表结构
    linesDF.printSchema()

    //查看数据
    linesDF.show()

    /**
     * 2、将DF注册成一个视图，才能写sql
     *
     */

    linesDF.createOrReplaceTempView("lines")


    /**
     *
     * 3、写spark sql 统计单词的数量
     * spark sql语法完全倦容hive sql
     *
     */

    val resultDF: DataFrame = spark.sql(
      """
        |
        |select word,count(1) as c from (
        |select explode(split(line,',')) as word from
        |lines
        |) as a
        |group by word
        |
        |
        |""".stripMargin)


    /**
     * 4、将数据保存到hdfs
     *
     */
    resultDF
      .write
      .format("csv") //保持数据的格式
      .option("sep", "\t") //数据分隔符
      .mode(SaveMode.Overwrite) //覆盖写数据
      .save("data/wc")


  }

}
